# -*- coding: utf-8 -*-
__author__ = 'lztkdr'
__date__ = '2020/4/13 22:15'

"""
	名词解释：
		特征选择：删除所有低方差（冗余的特征、没用的特征）特征，选择部分特征作为机器学习输入的数据。
		数据降维：特征数量太多，将不必要的特征删除掉,那么对应的数据就会减少，就叫数据降维。
	============================================================================================================
	数据降维包含：
		特征选择、主成分分析
	============================================================================================================
	特征选择的原因：
		冗余：部分特征的相关度高，容易消耗计算性能
		噪声：部分特征对预测结果有影响
	============================================================================================================
	特征选择是什么
		特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征，
		特征在选择前和选择后可以改变值、也不改变值，但是选择后的特征维数肯
		定比选择前小，毕竟我们只选择了其中的一部分特征。
	============================================================================================================
	特征选择 主要方法（三大武器）：
					   Filter(过滤式):VarianceThreshold 低方差特征
	     	           Embedded(嵌入式)：正则化、决策树、神经网络
		               Wrapper(包裹式)

	============================================================================================================
	PCA是什么？
	
	本质：PCA是一种分析、简化数据集的技术

	目的：是数据维数压缩，尽可能降低原数据的维数（复杂度），损失少量信息。
	
	作用：
		数据降维和简化数据结构。
		为什么降维？
			降维是为了减少数据的维度，减少计算和存储所需的计算机资源，有助于数据可视化。
	
	
	============================================================================================================
"""
from sklearn.feature_selection import VarianceThreshold
# PCA 主成分分析: 将数据分解为较低维数空间
# decomposition: 分解
from sklearn.decomposition import PCA


def var():
	"""
	VarianceThreshold：方差阈值
	特征选择:删除低方差的特征
	threshold 没有最终的值，根据实际的效果来取。
	从方差大小考虑这个特征的数据情况。
	:return: None
	"""

	var = VarianceThreshold(threshold=0.0)  # 0-10 之间的数 都可以，包含小数

	data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])

	print('VarianceThreshold 0.0:\n', data)

	var = VarianceThreshold(threshold=1.0)  # Variance Threshold : 方差阀门

	data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])

	print('VarianceThreshold 1.0:\n', data)

	return None


def pca():
	"""
	主成分分析:进行特征降维
	当特征数量达到成百上千的时候，可以考虑数据的简化，PCA可以使数据也会改变，特征数量会减少。
	:return: None
	"""
	pca = PCA(n_components=0.9)  # n_components: 0-1 的值，0.9 则表示保留 90% 的信息，一般使用小数： 0.9-0.95 之间。
	arr = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
	data = pca.fit_transform(arr)
	print("fit_transform \r\n", data)

	print("-------------------------------------")

	pca.fit(arr)
	data2 = pca.transform(arr)
	print("fit + transform \r\n", data2)
	return None


if __name__ == "__main__":
	var()
	print("=================================================================================")
	"""
		PCA(主成分分析)：
			如：如何最好的对一个立体的物体二维表示
			本质：PCA是一种分析、简化数据集的技术
			目的：是数据维数压缩，尽可能降低原数据的维数（复杂度），损失少量信息。
			作用：可以削减回归分析或者聚类分析中特征的数量
	"""
	pca()
